home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MISC.SWG / 0067_Hexagonal Grid Info.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  7KB  |  237 lines

  1. {
  2. I have a game I would like to make a PD project.  It's a war game, based on
  3. older style equipment, i.e., no nukes and such.  I haven't worked on it in
  4. several years, though.  I would like to make it multi node, or multi player
  5. somehow.  I think it would make a perfect object of discussion.  It's written
  6. in Pascal and was originally started in 4.0.  It needs to be re-written into
  7. objects and the code updated througout.  (My programming habits have changed
  8. significally, I may make less errors now, but, when I do, they are really
  9. stupid.)
  10.  
  11. Coordinating movements will be a challenge in a multi node system.
  12.  
  13. the logic would need to be changed, i.e., the movement directions, to
  14. accomodate ASCII characters that would represent the playing peices..
  15.  
  16. Here is code for a grid system I wrote...
  17. }
  18.  
  19. Program FillGrid;
  20.  
  21. { example of filling a hex sided grid with data about itself and it's
  22.   neighbors.
  23.  
  24.  Written By:  Herbert Brown and released to the public domain (1993)
  25.  please give credit were credit is due.. }
  26.  
  27. uses
  28.   dos,
  29.   crt;  { only for debugging }
  30.  
  31. const
  32.   MaxRows    = 7;
  33.   MaxColumns = 5;
  34.   MaxHex     = 32;   { only used for array and testing }
  35.  
  36. type
  37.   grid = record
  38.     id, nw, ne,
  39.     w, e, se, sw,
  40.     TerrainRec   : Longint;  { can be used as a reference to a database}
  41.   end;
  42.  
  43. var
  44.   GridVar     : Array [1..MaxHex] of grid;
  45.   gridCounter : Longint;
  46.   RowCounter,
  47.   ColCounter,
  48.   EndColumn   : Longint;
  49.   OddRow,
  50.   finished    : Boolean;
  51.   CurrentGrid : grid;
  52.   x           : integer;
  53.  
  54.  
  55. procedure getit(ColCounter, RowCounter, GridCounter, MaxColumns,
  56.                 MaxRows : Longint; Var CurrentGrid : grid);
  57.  
  58. begin
  59.   CurrentGrid.id := gridcounter;
  60.  
  61.   { The 9 possible cases tested Middle tested first for speed because there
  62.     are more of these in large maps }
  63.  
  64.   {middle}
  65.   if ((colcounter > 1) and (colcounter < EndColumn)) then
  66.   if (rowcounter <> 1) and (rowcounter <> maxrows) then
  67.   begin
  68.     CurrentGrid.nw := (gridcounter-MaxColumns);
  69.     CurrentGrid.w  := (gridcounter-1);
  70.     CurrentGrid.sw := (gridcounter+MaxColumns)-1;
  71.     CurrentGrid.se := gridcounter+maxColumns;
  72.     CurrentGrid.e  := gridcounter+1;
  73.     CurrentGrid.ne := (gridcounter-MaxColumns)+1;
  74.     exit;
  75.   end;
  76.  
  77.   {leftedge}
  78.   if (colcounter = 1) and (rowcounter <> 1) then
  79.   if (rowcounter <> maxrows) then
  80.   begin
  81.     if oddrow then
  82.       CurrentGrid.nw := (gridcounter-MaxColumns)
  83.     else
  84.       CurrentGrid.nw := 0;   { }
  85.     CurrentGrid.w  := 0;
  86.     if oddrow then
  87.       CurrentGrid.sw := (gridcounter+MaxColumns)-1
  88.     else
  89.       CurrentGrid.sw := 0;
  90.     CurrentGrid.se  := gridcounter+maxColumns;
  91.     CurrentGrid.e   := gridcounter+1;
  92.     CurrentGrid.ne  := (gridcounter-MaxColumns)+1;
  93.     exit;
  94.   end;
  95.  
  96.   {rightedge}
  97.   if (colcounter = EndColumn) and (rowcounter <> 1) then
  98.   if (rowcounter <> maxrows) then
  99.   begin
  100.     CurrentGrid.nw := (gridcounter-MaxColumns);
  101.     CurrentGrid.w  := (gridcounter-1);
  102.     CurrentGrid.sw := (gridcounter+MaxColumns)-1;
  103.     if oddrow then
  104.       CurrentGrid.se := gridcounter+maxColumns
  105.     else
  106.       CurrentGrid.se := 0;
  107.     CurrentGrid.e  := 0;
  108.     if oddrow then
  109.       CurrentGrid.ne := (gridcounter-MaxColumns)+1
  110.     else
  111.       CurrentGrid.ne := 0;
  112.     exit;
  113.   end;
  114.  
  115.   {toprow}
  116.   if (rowcounter = 1) and (colcounter <> 1) then
  117.   if (colcounter <> maxcolumns) then
  118.   begin
  119.     CurrentGrid.nw := 0;
  120.     CurrentGrid.w  := (gridcounter-1);
  121.     CurrentGrid.sw := (gridcounter+MaxColumns)-1;
  122.     CurrentGrid.se := gridcounter+maxColumns;
  123.     CurrentGrid.e  := gridcounter+1;
  124.     CurrentGrid.ne := 0;
  125.     exit;
  126.   end;
  127.  
  128.   {BottomRow}
  129.   if (rowcounter = maxrows) and (colcounter <> 1) then
  130.   if (colcounter <> maxcolumns)  then
  131.   begin
  132.     CurrentGrid.nw := (gridcounter-MaxColumns);
  133.     CurrentGrid.w  := (gridcounter-1);
  134.     CurrentGrid.sw := 0;
  135.     CurrentGrid.se := 0;
  136.     CurrentGrid.e  := gridcounter+1;
  137.     CurrentGrid.ne := (gridcounter-MaxColumns)+1;
  138.     exit;
  139.   end;
  140.  
  141.  
  142.   {TopLeftCorner}
  143.   if (colcounter = 1) and (rowcounter = 1) then
  144.   begin
  145.     CurrentGrid.nw := 0;  { Can't leave edge! }
  146.     CurrentGrid.w  := 0;
  147.     CurrentGrid.sw := 0;
  148.     CurrentGrid.se := gridcounter+maxColumns;
  149.     CurrentGrid.e  := gridcounter+1;
  150.     CurrentGrid.ne := 0;
  151.     exit;
  152.   end;
  153.  
  154.   {toprightcorner}
  155.   if (rowcounter = 1) and (colcounter = maxcolumns) then
  156.   begin
  157.     CurrentGrid.nw := 0;
  158.     CurrentGrid.w  := (gridcounter-1);
  159.     CurrentGrid.sw := (gridcounter+MaxColumns)-1;
  160.     CurrentGrid.se := 0;
  161.     CurrentGrid.e  := 0;
  162.     CurrentGrid.ne := 0;
  163.     exit;
  164.   end;
  165.  
  166.   {bottomleftCorner}
  167.   if (colcounter = 1) and (rowcounter = maxrows) then
  168.   begin
  169.     CurrentGrid.nw := 0;
  170.     CurrentGrid.w  := 0;
  171.     CurrentGrid.sw := 0;
  172.     CurrentGrid.se := 0;
  173.     CurrentGrid.e  := gridcounter+1;
  174.     CurrentGrid.ne := (gridcounter-MaxColumns)+1;
  175.     exit;
  176.   end;
  177.  
  178.   {BottomRightCorner}
  179.   if (colcounter = maxcolumns) and (rowcounter = maxrows) then
  180.   begin
  181.     CurrentGrid.nw := (gridcounter-MaxColumns);
  182.     CurrentGrid.w  := (gridcounter-1);
  183.     CurrentGrid.sw := 0;
  184.     CurrentGrid.se := 0;
  185.     CurrentGrid.e  := 0;
  186.     CurrentGrid.ne := 0;
  187.     exit;
  188.   end;
  189.  
  190. end;
  191.  
  192. begin
  193.   clrscr;
  194.   { fill the record array out for debugging or "watch" purposes
  195.     this loop was only used for debugging }
  196.   for x := 1 to MaxHex do
  197.   begin
  198.     GridVar[x].id := 0;
  199.     gridvar[x].nw := 0;
  200.     gridvar[x].ne := 0;
  201.     gridvar[x].w  := 0;
  202.     gridvar[x].e  := 0;
  203.     gridvar[x].se := 0;
  204.     gridvar[x].sw := 0;
  205.     gridVar[x].TerrainRec:=0;
  206.   end;
  207.  
  208.   fillchar(CurrentGrid,sizeof(currentgrid),0);
  209.   GridCounter := 1;
  210.   RowCounter:=1;
  211.   ColCounter:=1;
  212.   Oddrow:=False;
  213.   Finished := False;
  214.   EndColumn := MaxColumns;
  215.  
  216.   while not finished do
  217.   begin { while }
  218.     getit(ColCounter,RowCounter,GridCounter,MaxColumns,MaxRows,CurrentGrid);
  219.     gridvar[gridcounter]:=CurrentGrid;  { <- can be stored to a vitual array or
  220.                                          data base file here }
  221.     Inc(ColCounter);    { next grid id }
  222.     Inc(gridCounter);
  223.     if colcounter = EndColumn+1 then
  224.     begin
  225.       Oddrow := not oddrow;
  226.       ColCounter:=1;
  227.       if rowcounter = MaxRows then
  228.         finished := True;
  229.       inc(rowcounter);  { next row }
  230.       if not oddrow then
  231.         EndColumn := MaxColumns
  232.       else
  233.         EndColumn := MaxColumns - 1;
  234.     end;
  235.   end;
  236. end.
  237.